<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript">

        /*
         * 基本数据类型
         * 	String Number Boolean Null Undefined
         *
         * 引用数据类型
         * 	Object
         *
         * 	JS中的变量都是保存到栈内存中的，
         * 	基本数据类型的值直接在栈内存中存储，
         * 	值与值之间是独立存在，修改一个变量不会影响其他的变量
         *
         * 	JS中的对象是保存到堆内存中的，每创建一个新的对象，就会在堆内存中开辟出一个新的空间，
         * 	而变量保存的是对象的内存地址（对象的引用），如果两个变量保存的是同一个对象引用，
         * 	当一个通过一个变量修改属性时，另一个也会受到影响
         */

        //1、栈内存 变量a和b值独立
        var a = 123;
        var b = a;
        a++;
        console.log("a = " + a);
        console.log("b = " + b);

        //2、堆内存 对象1和对象2相互引用，对象1比变了，对象2跟着变。
        var obj = new Object();
        obj.name = "孙悟空";
        var obj2 = obj;
        //修改obj的name属性
        obj.name = "猪八戒";
        console.log(obj.name);
        console.log(obj2.name);

        //设置obj2为null，修改对象obj2引用时，原对象obj不变。
        obj2 = null;
        console.log(obj);  //object
        console.log(obj2); //null

        var c = 10;
        var d = 10;
        console.log(c == d);

		//创建两个对象，在栈内存创建两个变量，在堆内存加两个空间。
        var obj3 = new Object();
        var obj4 = new Object();
        obj3.name = "沙和尚";
        obj4.name = "沙和尚";
        console.log(obj3);
        console.log(obj4);

        /*
         * 3、当比较两个基本数据类型的值时，就是比较值。
         * 而比较两个引用数据类型时，它是比较的对象的内存地址，
         * 如果两个对象是一摸一样的，但是地址不同，它也会返回false。
         */
        console.log(obj3 == obj4);

    </script>
</head>
<body>
</body>
</html>
